package org.example.ai04.service;

import com.google.gson.Gson;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.example.ai04.dto.DeeseekRequest;
import org.example.ai04.dto.DeeseekResponse;
import org.example.ai04.dto.ResumeData;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 聊天服务类
 * 负责处理用户与简历相关的聊天请求
 * 通过调用外部AI模型API生成基于简历内容的回答
 */
@Service
public class ChatService {
    
    // 日志记录器，用于记录服务操作和错误信息
    private static final Logger logger = LoggerFactory.getLogger(ChatService.class);
    
    // Gson实例，用于JSON序列化和反序列化
    private final Gson gson = new Gson();
    /**
     * 处理用户与简历相关的聊天请求
     * 根据简历内容和用户问题，调用指定的AI模型生成回答
     * 
     * @param resumeData 结构化的简历数据对象
     * @param question 用户提出的问题
     * @param chatHistory 聊天历史记录列表
     * @param originalJson 原始简历数据的JSON字符串
     * @param aiModel 要使用的AI模型名称
     * @return AI模型生成的回答文本
     */
    public String chatWithResume(ResumeData resumeData, String question, List<ResumeData.ChatMessage> chatHistory, String originalJson, String aiModel) {
        try {
            // 第一步：构建包含简历信息和用户问题的提示词
            String prompt = "基于简历JSON:" + originalJson + "\n回答问题:" + question;
            
            // 第二步：调用AI模型API获取回答
            String response = callChatAPI(prompt, aiModel);
            
            // 第三步：从API响应中提取纯文本回答
            return extractAnswer(response);
        } catch (Exception e) {
            // 发生异常时记录错误日志并返回统一的错误提示
            logger.error("处理聊天请求时发生异常", e);
            return "无法回答";
        }
    }

    /**
     * 调用外部AI模型API发送请求并获取响应
     * 根据指定的AI模型名称选择对应的API配置
     * 
     * @param prompt 要发送给AI模型的提示词
     * @param aiModel 要使用的AI模型名称
     * @return AI模型返回的原始响应字符串
     * @throws UnirestException 当HTTP请求失败时抛出
     */
    private String callChatAPI(String prompt, String aiModel) throws UnirestException {
        // 根据模型选择配置对应的API密钥、URL和模型名称
        String apiKey, apiUrl, modelName;
        
        if ("hunyuan-lite".equals(aiModel)) {
            // 腾讯混元模型配置
            apiKey = "sk-uVfDzLm7SdZ80fNFcywGxUt9vTWau6kkAaMHcnxcI9ClRG1n"; // 注意：实际生产环境应从配置文件或环境变量中读取
            apiUrl = "https://api.hunyuan.cloud.tencent.com/v1/chat/completions";
            modelName = "hunyuan-lite";
        } else {
            // 默认使用DeepSeek模型配置
            apiKey = "sk-9483d697aaa0459591f6116e2c930265"; // 注意：实际生产环境应从配置文件或环境变量中读取
            apiUrl = "https://api.deepseek.com/v1/chat/completions";
            modelName = "deepseek-chat";
        }
        
        // 构建请求对象并转换为JSON字符串
        String json = gson.toJson(DeeseekRequest.builder()
            .model(modelName)
            .messages(List.of(
                // 系统角色消息，定义AI助手的行为
                DeeseekRequest.Message.builder().role("system").content("HR助手").build(),
                // 用户角色消息，包含实际要处理的提示词
                DeeseekRequest.Message.builder().role("user").content(prompt).build()
            ))
            .build());
        
        // 使用Unirest发送POST请求到AI模型API
        HttpResponse<String> httpResponse = Unirest.post(apiUrl)
            .header("Content-Type", "application/json")  // 设置内容类型为JSON
            .header("Authorization", "Bearer " + apiKey)  // 设置Authorization头部，包含API密钥
            .body(json)  // 设置请求体为构建好的JSON字符串
            .asString();  // 以字符串形式获取响应
            
        // 提取并返回响应体内容
        return httpResponse.getBody();
    }
    
    /**
     * 从AI模型API的响应中提取纯文本回答内容
     * 使用字符串查找方法定位content字段的值
     * 
     * @param response AI模型API返回的原始响应字符串
     * @return 提取出的纯文本回答内容
     */
    private String extractAnswer(String response) {
        try {
            // 查找content字段的起始位置并偏移到值的开始（正确的JSON格式应该是带引号的"content"）
            int start = response.indexOf("\"content\":\"") + 11;
            
            // 如果找不到标准的content字段格式，尝试其他可能的格式
            if (start == 10) { // 如果indexOf返回-1，则start会是-1+11=10
                start = response.indexOf("content\":\"") + 10;
                if (start == 9) { // 再次检查是否找到
                    // 如果仍然找不到，尝试使用Gson解析整个JSON响应
                    try {
                        DeeseekResponse deeseekResponse = gson.fromJson(response, DeeseekResponse.class);
                        if (deeseekResponse != null && deeseekResponse.getChoices() != null && !deeseekResponse.getChoices().isEmpty()) {
                            return deeseekResponse.getChoices().get(0).getMessage().getContent().replace("\\n", "\n");
                        }
                    } catch (Exception ex) {
                        logger.warn("尝试使用Gson解析响应失败", ex);
                    }
                    return "无法解析回答内容";
                }
            }
            
            // 查找content字段值的结束位置
            int end = response.indexOf('"', start);
            
            // 提取回答文本并将转义的换行符替换为实际换行符
            return response.substring(start, end).replace("\\n", "\n");
        } catch (Exception e) {
            // 提取过程中发生异常时记录错误日志并返回统一的错误提示
            logger.error("提取AI回答时发生异常", e);
            return "回答错误";
        }
    }
    
    /**
     * 创建聊天消息对象
     * 自动添加当前时间戳作为消息发送时间
     * 
     * @param role 消息角色，如"user"(用户)或"assistant"(AI助手)
     * @param content 消息内容文本
     * @return 构建好的ChatMessage对象
     */
    public ResumeData.ChatMessage createChatMessage(String role, String content) {
        return ResumeData.ChatMessage.builder()
                .role(role)  // 设置消息角色（user或assistant）
                .content(content)  // 设置消息内容文本
                // 设置当前时间作为消息时间戳，格式为"HH:mm"
                .timestamp(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")))
                .build();
    }
}